gtktreeselection: Fix potential NULL pointer dereferences
authorPhilip Withnall <philip.withnall@collabora.co.uk>
Wed, 20 Nov 2013 17:38:01 +0000 (17:38 +0000)
committerPhilip Withnall <philip.withnall@collabora.co.uk>
Mon, 9 Mar 2015 13:41:37 +0000 (13:41 +0000)
_gtk_rbtree_first() can potentially return NULL if the RB tree is empty,
which would result in NULL pointer dereferences in the GtkTreeSelection
code. Gracefully handle them.

Found by scan-build.

https://bugzilla.gnome.org/show_bug.cgi?id=712760

gtk/gtktreeselection.c

index f797ee3059c5246b4af9204a5b17bf1a978a87cd..778d76427afd56231f813a6c9a49dabf7aa3805d 100644 (file)
@@ -596,7 +596,7 @@ gtk_tree_selection_get_selected_rows (GtkTreeSelection   *selection,
   node = _gtk_rbtree_first (tree);
   path = gtk_tree_path_new_first ();
 
-  do
+  while (node != NULL)
     {
       if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
        list = g_list_prepend (list, gtk_tree_path_copy (path));
@@ -638,7 +638,6 @@ gtk_tree_selection_get_selected_rows (GtkTreeSelection   *selection,
          while (!done);
        }
     }
-  while (TRUE);
 
   gtk_tree_path_free (path);
 
@@ -653,6 +652,8 @@ gtk_tree_selection_count_selected_rows_helper (GtkRBTree *tree,
 {
   gint *count = (gint *)data;
 
+  g_return_if_fail (node != NULL);
+
   if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
     (*count)++;
 
@@ -789,7 +790,7 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection            *selection,
   /* find the node internally */
   path = gtk_tree_path_new_first ();
 
-  do
+  while (node != NULL)
     {
       if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
         {
@@ -838,7 +839,6 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection            *selection,
          while (!done);
        }
     }
-  while (TRUE);
 
 out:
   if (path)
@@ -1614,6 +1614,8 @@ gtk_tree_selection_real_select_node (GtkTreeSelection *selection,
   gboolean toggle = FALSE;
   GtkTreePath *path = NULL;
 
+  g_return_val_if_fail (node != NULL, FALSE);
+
   select = !! select;
 
   if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED) != select)